package c06.atomic;

import java.util.ArrayList;
import java.util.List;

public interface Account {
    // 获取余额
    Integer getBalance();

    // 取款
    void withdrawal(Integer amount);

    /**
     * 方法内会启动 1000 个线程，每个线程做 -10 元 的操作
     * 如果初始余额为 10000 那么正确的结果应当是 0
     */
    static void transfer(Account account) {
        List<Thread> ts = new ArrayList<>();
        // 1. 创建1000个线程
        for (int i = 0; i < 1000; i++) {
            ts.add(new Thread(() -> {
                account.withdrawal(10);
            }));
        }

        // 4.1 计时开始
        long start = System.nanoTime();

        // 2. 开启1000个线程
        ts.forEach(Thread::start);
        // 3. 等待1000线程执行完成
        ts.forEach(t -> {
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // 4.2 统计1000个人取款总共消耗的时间
        long end = System.nanoTime();
        System.out.println(account.getBalance() + " cost: " + (end - start) / 1000_000 + " ms");
    }
}
